\chapter{Anonimato}
Si può parlare di {\bf anonimato} in vari modi, a seconda del tipo o del livello che si vuole ottenere.\\
Per quanto riguarda il tipo si può:
\begin{itemize}
 \item richiedere l'anonimato dei nodi partner in un sistema di comunicazione in cui avvengano delle transizioni
 \item richiedere l'anonimato dell'autore di un documento (es. in un sistema di file sharing).
\end{itemize}
Anche per quanto riguarda il livello posso avere diversi contesti in cui applicare diverse quantità di anonimato:
\begin{itemize}
 \item {\bf Negazione plausibile}, in cui non è possibile identficae con certezza l'autore di una determinata operazione.
 \item {\bf Probabilità}, in cui si riducono le probabilità di indicare un dato nodo come autore di un documento o partecipante ad una comunicazione.
 \item {\bf Insospettabilità}, cioè una situazione in cui è assolutamente impossibile associare un nodo come possibile autore.
\end{itemize}
Un esempio classico si trova nei sistemi resistenti alla censura, anche se questi sono più complicati rispetto al caso di semplice anonimato perchè si richede anche disponibilità e integrità dei dati.\\

\section{Anonimato dei partner in una comunicazione}
\subsection{Tecniche}
In sistemi P2P esistono file di log e altre informazioni che tengono traccia delle comunicazioni tra peer, si vuole fare in modo che in questi file non rimangano prove dirette e inconfutabili dell'avvenuta comunicazione, si può per esempio cancellare queste informazioni.
\subsubsection{Livello 0: Cancellazione eager}
Di solito ai bassi livelli per ragioni di efficienza si adotta una tecnica di tipo lazy per la cancellazione dei file di log, cioè li si elimina solo quando occupano tutta la memoria disponibile. Mentre il livello 0 di anonimato prevede la cancellazione immediata deii file di log, secondo una tecnica di tipo {\it eager}. La cancellazione non è più  finalizzata al recupero della memoria ma per evitare che le informazioni vengano lette.
\subsubsection{Livello 1: Proxy anonimizzanti}
Utilizzando dei proxy anonimizzanti si eliminano i dati sensibili dal protocollo applicativo (tipo HTTP). Nelle richieste tra browser e server ci sono delle informazioni in più (ad esempio i cookie) che in teoria dovrebbero servire x migliorare la comunicazione ma in realtà vengono usati per tenere traccia del richiedente e del suo interesse. Il livello 1 consiste quindi di una serie di misure (es. Privoxy) che tolgono queste informazioni aggiuntive o le falsificano in modo tale che il traffico non sia tracciabile.
\subsubsection{Livello 2: Cifratura dei dati}
La cifratura dei dati viene utilizzata per evitare un eventuale lettura del traffico generato, ad ogni hop effettuato nella trasmissione dei dati si modifica la codifica binaria dei pacchetti costituenti l'informazione secondo una {\bf chiave simmetrica} ogni volta diversa. L'operazione di codifica è della forma C=E(k,M), con M il pacchetto , k chiave ed E cifratura, per la decodifica (M=D(k,C)).\\
Il problema con questo tipo di codifica è che essendo la chiave simmetrica chiunque sia in grado di codificare un dato può anche decodificarlo, quindi all'attaccante basta un solo nodo con il funzionamento compromesso per scoprire il contenuto dei pacchetti e tracciarne quindi il percorso.
\subsubsection{Livello 3: Onion routing (TOR)}
Per risolvere i problemi del livello 2 invece che a una a chiave simmetrica si ricorre ad una {\bf crittografia a chiave pubblica}. In questo tipo di codifica esiste una coppia di chiavi ($k_1,k_2$), una che permette di codificare il dato e una che permette di decodificarlo. La chiave per la codifica viene resa pubblica, quella per la decodifica invece è nota solo ad uno dei nodi che compongono la rete, ed è importante che dalla chiave di codifica non si possa risalire a quella di decodifica.\\
Un messaggio deve seguire una certa strada per arrivare a destinazione, ad esempio 1-2-3: gli viene aggiunto un header che indichi la strada da seguire, quindi viene cifrato nell'ordine con $k_{p3}, k_{p2}, k_{p1}$ e mandata al nodo 1. Questo applica la sua chiave segreta e mandata al nodo 2, che decodifica e così via fino ad arrivare al destinatario. Per confondere ulteriormente le acque ad un'eventuale spia si possono aggiungere degli hop, ma non se ne possono togliere perchè in questo modo si comprometterebbe il processo di decodifica.\\
La crittografia a chiave pubblica è molto meno efficiente di quella a chiave simmetrica, quindi si può pensare di usare un sistema di cifratura ibrido: di base uso delle chiavi simmetriche, che viene però decifrata con una {\bf chiave di sessione} scelta in modo casuale con generatori indipendenti e dal comportamento non predicibile. In altre parole questo procedimento equivale a cifrare la chiave simmetrica con una chiave pubblica.\\
Per mandare più volte lo stesso messaggio si può generare ogni volta una chiave di sessione diversa in modo che l'attaccante non si accorga che è in atto la ritrasmissione dello stesso dato.

\insertImage{0.5}{tor1.png}{Inizio rete tor}
\insertImage{0.5}{tor2.png}{Instradamento random della richiesta}
\insertImage{0.7}{tor3.png}{Nuova richiesta}



\subsubsection{Livello 4: Mixing}
Un problema che si presenta sulle reti che implementano l'onion routing è che in presenza di un solo attore o comunque di un solo messaggio si riesce a tracciare la comunicazione nel caso migliore in cui non si riesca anche a decodificare il messaggio. Quindi per avere un vantaggio reale occorre che ci siano tanti pacchetti che circolano nella rete contemporaneamente per abbassare la probabilità di decodifica da parte dell'attaccante.\\ Un modo in cui si ottiene questo è appunto il mixing, per cui ogni nodo che riceve il nodo non lo instrada appena lo ha decodificato, ma attende di avere altri messaggi da mandare. In questo modo l'attaccante non riesce a capire quale pacchetto appartiene ad un dato messaggio e non può ricostruire l'informazione completa. Ovviamente il nodo non instrada i pacchetti nell'ordine in cui gli sono arrivati ma in modo casuale.
\subsubsection{Livello 5: Steganografia}
Questo metodo nasconde la presenza di informazioni nel seguente modo: identifica contenuti ridondanti formati da un grande numero di bit (detti {\bf contenitori}) e modifica alcuni di questi bit senza alterare il significato del contenitore per codificare l'informazione che interessa scambiare. Questi bit vengono detti {\bf contenuto} e devono essere il meno evidenti possibile, di solito li si mette nel bit meno significativo di un pacchetto.\\
Questo principio è anche alla base del {\bf tunneling}, che apre dei canali di comunicazione non visibili dall'esterno all'interno di protocolli universalmente conosciuti (ad esempio il DNS). In questo modo risulta possibile mandare messaggi su una rete tipo TOR senza essere visibilmente connesso a questa rete.

\section{Freenet}
{\bf Freenet} è una rete decentralizzata, creata per resistere alla censura, che sfrutta le risorse dei suoi utenti per permettere la pubblicazione e la fruizione di qualsiasi tipo di informazione. Freenet è stata costruita pensando ad anonimato e sicurezza, non alla velocità di trasmissione. Questa caratteristica la rende poco indicata per lo scambio di file di grosse dimensioni.\\\\
La rete Freenet è progettata per essere resistente; per questo i processi di funzionamento interni lavorano tutti coperti da anonimato e sono decentralizzati su tutta la rete. Il sistema non ha server centrali e non è soggetto a controlli nè da privati nè da organizzazioni. Nemmeno l'ideatore di Freenet ha alcun controllo sul sistema. La rete è stata progettata in modo tale che le informazioni vengano crittografate e replicate su molti diversi nodi in continuo cambiamento in tutto il mondo. E' estremamente difficile per un attaccante capire quali nodi stiano rendendo disponibile un determinato file in un certo momento e gli stessi tenutari dei nodi non sanno mai cosa stanno distribuendo. Questo li mette al sicuro da eventuali reati di detenzione.

\subsection{GUID}
Vengono utilizzati dei {\bf GUID, Global Unique Identifier}, per identificare i file. L'identificatore non contiene nessuna informazione relativa alla posizione fisica all'interno della rete.\\
Esistono due tipi di GUID:
\begin {itemize} 
\item {\bf CHK}: ovvero l'hashing dell contenuto del file. Solitamente si usa la funzione di hashing SHA-1.\\
	Utilizzando CHK è possibile anche verificare l'integrità del file, infatti una volta ricevuto il file, qeusto non sarà integro se rieseguendo l'hashing del contenuto i due identificatori saranno differenti.\\
	Ulizzando una copia del file però risulta essere possibile risalire al CHK corrispondente senza brute-force.
\item {\bf SSK}, Signed Subspace Key, realizzato utilizzando una stringa identificativa, scelta da chi vuole pubblicare il file all'interno della rete. La stringa è del tipo "libri/gialli/Maigret/, dove ogni keyword indica cosa è contenuto all'interno del file. Una volta determinata la stringa si calcola l'hashing e una coppia di chiavi, una privata e una pubblica, su quest'ultima viene applicato un hashing e si costruisce una stringa formata dalla funsione delle due impronte hash ottenute precedentemente si cui viene eseguito un nuovo hashing, la stringa così ottenuta sarà l'SSK'.\\
E' possibile utilizzare una chiave per ogni singolo documento, per mantenere un maggiore anonimato, oppure per autore.
I documenti possono essere autenticati utilizzando la chiave privata associata a quella pubblica e utilizzando CHK e SSK è possibile anche per l'autore modificare i file, rieseguendo le operazioni che hanno portato ad associare un determinato CHK ad un SSK. Utilizzando questo meccanismo solo l'autore può modificare il file.\bigskip
 \end{itemize}

 \subsection{L'instrademento delle richieste}
 L'instrademento delle richieste viene effettuate tenendo conto delle esigenze di ricerca e di anonimato.\\Viene evitato il flooding, oltre che per motivi di efficienza, per non divulgare all'interno della rete la richiesta del client che l'ha effettuata quindi si propagano eventuali richieste di informazioni in una sola direzione. Viene applicato un identificatore ad ogni nodo simulando così il comportamento di un overlay strutturato in cui seguengo un algoritmo di riallocazione dinamica delle informazioni a migrare verso i peer che hanno una maggiore similarità con il loro indentificatore. L'SSK sarà conservato nel peer il cui identifiatore si approssima meglio alla chiave, quindi la propagazione avviene verso quel peer.\\
 Non si distringue in FreeNet la ricerca di dati o metadati, entrambi sono delle stringhe binarie ed entrambi possono migrare.\\
 Ogni richiesta viene associata ad un TTL, non esistono percorsi minimi e massimi quindi la richiesta viene propagata fino allo scadere del TTL. Se invece la ricerca ha fine si ripropaga indietro la risposta, tutte queste comunicazioni sono cifrate. Un ulteriore meccanismo di anonimato all'interno della rete durante la propagazione della risposta un peer intermedio può alterare i metadati riguardanti il possessore della risorsa, quindi una volta ricevuta la risorsa il client potrebbe non risalire correttamente alla posizione del file essendo questa informazione sbagliata.\\
 Alternativamente un peer può realizzare una copia della risorsa rendendo quindi la ricerca più efficiente e aumentando la disponibilità di copie.\\
 I peer inoltre possono cancellare delle risorse per risparmiare dello spazio, cancellando quelle risorse con il numero minore di richieste.\\
 Il comportamento è analogo a come avviene con l'algoritmo ADM senza avere però una struttura definita. 